<?php

namespace Agp\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Agp\AdminBundle\Validator\Constraints as AdminAssert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Agp\CoreBundle\Entity\Atendente;
use Doctrine\Common\Collections\ArrayCollection;
use Agp\CoreBundle\Entity\TerminalEmpresaConfig;
use APY\DataGridBundle\Grid\Mapping as GRID;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Agp\CoreBundle\Entity\Evento
 *
 * @ORM\Table(name="evento")
 * @ORM\Entity(repositoryClass="Agp\CoreBundle\Repository\EventoRepository")
 * @ORM\HasLifecycleCallbacks()
 * 
 * @GRID\Source(groups="agape", columns="codEvento, empresa.razaoSocial, info.descricao, info.local, info.dtInicio, info.dtTermino, situacao, info.cidade.nome")
 * @GRID\Source(groups="admin", columns="codEvento, info.descricao, info.local, info.dtInicio, info.dtTermino, situacao, info.cidade.nome")
 * @GRID\Source(groups="ecommerce", columns="codEvento, info.dtInicio, info.descricao, info.cidade.nome, info.cidade.estado.uf")
 */
class Evento
{
    /**
     * @var integer $codEvento
     *
     * @ORM\Column(name="cod_evento", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @GRID\Column(title="Código", visible=false, type="text", size="5", primary=true)
     */
    protected $codEvento;

    /**
     * @var object $empresa
     *
     * @ORM\ManyToOne(targetEntity="Empresa", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_empresa", referencedColumnName="cod_empresa")
     * 
     * @GRID\Column(field="empresa.razaoSocial", title="Empresa", type="text", size="500")
     */
    protected $empresa;

    /**
     * @ORM\ManyToMany(targetEntity="Agp\CoreBundle\Entity\FormaPagamento")
     * @ORM\JoinTable(name="evento_forma_pagamento",
     *     joinColumns={@ORM\JoinColumn(name="cod_evento", referencedColumnName="cod_evento", onDelete="Cascade")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_forma_pagamento", referencedColumnName="cod_forma_pagamento")}
     * )
     * @var ArrayCollection $formasPgto
     */ 
    protected $formasPgto;
    
    /**
     * @ORM\OneToMany(targetEntity="EventoLista", mappedBy="evento", cascade={"all"})
     * @ORM\OrderBy({"ordem" = "ASC"})
     */ 
    protected $listas;
    
    /**
     * @ORM\ManyToMany(targetEntity="Agp\CoreBundle\Entity\Atendente")
     * @ORM\JoinTable(name="evento_atendente",
     *     joinColumns={@ORM\JoinColumn(name="cod_evento", referencedColumnName="cod_evento", onDelete="Cascade")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_atendente", referencedColumnName="cod_atendente")}
     * )
     * @var ArrayCollection $pontos
     */ 
    protected $atendentes;
    
    /**
     * @ORM\OneToMany(targetEntity="EventoTerminalEmpresa", mappedBy="evento", cascade={"all"})
     */ 
    protected $terminais;
    
    /**
     * @ORM\ManyToMany(targetEntity="Agp\CoreBundle\Entity\Pessoa", inversedBy="eventos", cascade={"persist"})
     * @ORM\JoinTable(name="evento_pessoa",
     *     joinColumns={@ORM\JoinColumn(name="cod_evento", referencedColumnName="cod_evento", onDelete="Cascade")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="cod_pessoa", referencedColumnName="cod_pessoa")}
     * )
     * @var ArrayCollection $pontos
     */ 
    protected $pessoas;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\InfoEvento", cascade={"all"})
     * @ORM\JoinColumn(name="cod_info_evento", referencedColumnName="cod_info_evento")
     * @var object
     * 
     * @GRID\Column(field="info.cidade.nome", title="Cidade", visible=false, type="text", size="400")
     * @GRID\Column(field="info.cidade.estado.uf", title="Estado", visible=false, type="text", size="400")
     * @GRID\Column(field="info.descricao", title="Evento", type="text", size="500")
     * @GRID\Column(field="info.dtInicio", title="Início", type="date", align="center")
     * @GRID\Column(field="info.dtTermino", title="Término", type="date", align="center")
     * @GRID\Column(field="info.local", title="Local", type="text")
     */
    protected $info;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\EventoConfig", cascade={"all"}, inversedBy="evento")
     * @ORM\JoinColumn(name="cod_evento_config", referencedColumnName="cod_evento_config")
     * @var object
     */
    protected $eventoConfig;
 
    const SIT_ATIVO = 'Ativo';
//    const SIT_INATIVO = 'Inativo';
//    const SIT_PENDENTE = "Pendente";
    const SIT_FINALIZADO = 'Finalizado';
    /**
     * @var string $situacao
     *
     * @ORM\Column(name="situacao", type="string", nullable=false)
     * 
     * @GRID\Column(title="Situação", type="text", align="center", filter="select", selectFrom="source")
     */
    protected $situacao;
    
    /**
     * @var string $atualizado
     *
     * @ORM\Column(name="dt_att", type="datetime", nullable=false)
     * 
     */
    protected $atualizado;

    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\Imagem", cascade={"all"})
     * @ORM\JoinColumn(name="cod_imagem", referencedColumnName="cod_imagem", onDelete="set null")
     * @var object
     */
    protected $imagem;
    
    /**
     * @ORM\OneToOne(targetEntity="Agp\CoreBundle\Entity\Imagem", cascade={"all"})
     * @ORM\JoinColumn(name="cod_imagem_banner", referencedColumnName="cod_imagem", onDelete="set null")
     * @var object
     */
    protected $banner;
    
    /**
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\Imagem", cascade={"all"})
     * @ORM\JoinColumn(name="cod_mapa", referencedColumnName="cod_imagem", onDelete="set null")
     * @var object
     */
    protected $mapa;
    
    /**
     * @var string $habilitaEnvioExtrato
     *
     * @ORM\Column(name="habilita_envio_extrato", type="boolean", nullable=true)
     */
    protected $habilitaEnvioExtrato;
    
    /**
     * @var string $email
     *
     * @ORM\Column(name="email_extrato", type="text", nullable=true)
     */
    protected $emailExtrato;
    
    /**
     * @var string $intervaloExtrato
     *
     * @ORM\Column(name="intervalo_envio_extrato", type="integer", nullable=true)
     */
    protected $intervaloExtrato;
    
    /**
     * @var string $dtCreate
     *
     * @ORM\Column(name="dt_criado", type="date", nullable=false)
     * 
     */
    protected $dtCreate;
    
    /**
     * @var string $visualizacao
     *
     * @ORM\Column(name="visualizacao", type="integer", nullable=true)
     * 
     */
    protected $visualizacao;
    
    /**
     * @ORM\OneToMany(targetEntity="Repasse", mappedBy="evento", cascade={"all"})
     */ 
    protected $repasses;
    
    const TP_MAPA_QUADRADO = 'Quadrado - 1200px por 1200px';
    const TP_MAPA_RETANGULO = 'Retângulo - 1600px por 700px';
    const TP_MAPA_RETANGULO_GRANDE = 'Retângulo Grande - 3200px por 700px';
    /**
     * @var string $tipoMapa
     *
     * @ORM\Column(name="tipo_mapa", type="text", nullable=true)
     */
    protected $tipoMapa;
    
    /**
     * @ORM\OneToMany(targetEntity="Ambiente", mappedBy="evento")
     */ 
    protected $ambientes;
    
    const TP_S_MANUAL = 'Manual';
    const TP_S_AUTOMATICO = 'Automatico';
    /**
     * @var string $tipoSistema
     *
     * @ORM\Column(name="tipo_sistema", type="string", nullable=false)
     * 
     */
    protected $tipoSistema;
    
    public function getArrayEmails(){
        $emails = explode(';', $this->emailExtrato);
        $return = array();
        
        foreach ($emails as $email){
            if ($email != ""){
                $return[] = trim($email);
            }
        }
        
        return $return;
        
    }

    public function __toString() {
        return $this->info->getDescricao();
    }
    
    public function __construct() {
        $this->listas = new ArrayCollection();
        $this->pontos = new ArrayCollection();
        $this->formasPgto = new ArrayCollection();
        $this->situacao = self::SIT_ATIVO;
        $this->atualizado = new \DateTime;
        $this->dtCreate = new \DateTime;
        $this->tipoMapa = self::TP_MAPA_QUADRADO;
        $this->tipoSistema = self::TP_S_MANUAL;
    }

    public function getCodCrip(){
        return \base64_encode($this->getEmpresa()->getCodEmpresa().'*'.rand().'*'.$this->codEvento.'*'.rand());
    }

    /* hack for Acls */
    public function getId(){
        return 'class';
    }

    public function getPdvs(){
        $pdvs = array();
        foreach ($this->atendentes as $ponto){
            if ($ponto->getTipo() == Atendente::TP_PDV){
                $pdvs[] = $ponto;
            }
        }
        
        return $pdvs;
    }
    
    public function getAtendentesComuns(){
        $atens = array();
        foreach ($this->atendentes as $aten){
            if ($aten->getTipo() == Atendente::TP_ATEN){
                $atens[] = $aten;
            }
        }
        
        return $atens;
    }
    
    public function getComissionados(){
        $cons = array();
        foreach ($this->atendentes as $con){
            if ($con->getTipo() == Atendente::TP_COM){
                $cons[] = $con;
            }
        }
        
        return $cons;
    }
    
    public function isPdv($terminalEmpresa){
        foreach ($this->getPdvs() as $pdv){
            foreach ($pdv->getTerminais() as $terminal){
                if ($terminal->getCodTerminalEmpresa() == $terminalEmpresa){
                    return true;
                }
            }
        }
    }
    
    public function getTotalVenda(){
        $total = 0;
        foreach ($this->vendas as $v){
            $total += $v->getValorTotalAtivo();
        }
        return $total;
    }

    /**
     * Get codEvento
     *
     * @return integer 
     */
    public function getCodEvento()
    {
        return $this->codEvento;
    }

    /**
     * Set empresa
     *
     * @param integer $empresa
     * @return Atendente
     */
    public function setEmpresa($empresa)
    {
        $this->empresa = $empresa;
    
        return $this;
    }

    /**
     * Get empresa
     *
     * @return integer 
     */
    public function getEmpresa()
    {
        return $this->empresa;
    }

    public function getFormasPgto() {
        return $this->formasPgto;
    }

    public function setFormasPgto($formasPgto) {
        $this->formasPgto = $formasPgto;
    }

    public function getListas() {
        return $this->listas;
    }

    public function setListas($listas) {
        $this->listas = $listas;
    }
    
    public function addLista($lista) {
        $this->listas[] = $lista;
    }

    public function addPonto($ponto) {
        $this->pontos[] = $ponto;
    }
    
    public function removePonto($ponto)
    {
        $this->pontos->removeElement($ponto);
    }

    public function getInfo() {
        return $this->info;
    }

    public function setInfo($info) {
        $this->info = $info;
    }
    
    public function getTerminais() {
        return $this->terminais;
    }
    
    public function getTerminaisNotPassaporte(){
        $terminais = array();
        
        foreach ($this->terminais as $t){
            if ($t->getTerminalEmpresa()->getCompartilhado() == false){
                $terminais[] = $t;
            }
        }
        
        return $terminais;
        
    }
    
    public function getTerminaisPassaporte(){
        $terminais = array();
        
        foreach ($this->terminais as $t){
            if ($t->getTerminalEmpresa()->getCompartilhado() == true){
                $terminais[] = $t;
            }
        }
        
        return $terminais;
        
    }

    public function getTerminaisEmpresa(){
        $terminais = array();
        foreach ($this->terminais as $terminal){
            $terminais[] = $terminal->getTerminalEmpresa();
        }
        
        return $terminais;
    }

    public function setTerminais($terminais) {
        $this->terminais = $terminais;
    }
    
    public function getSituacao() {
        return $this->situacao;
    }

    public function setSituacao($situacao) {
        $this->situacao = $situacao;
    }

    public static function getSituacaoList(){
        return array(self::SIT_ATIVO => self::SIT_ATIVO,
                     self::SIT_FINALIZADO => self::SIT_FINALIZADO);
    }
    
    public function isAtivo(){
        return ($this->situacao == self::SIT_ATIVO);

    }
    
    public function getPessoas() {
        return $this->pessoas;
    }

    public function setPessoas($pessoas) {
        
        foreach ($pessoas as $p){
            $p->addEvento($this);
        }
        
        $this->pessoas = $pessoas;
    }
    
    public function addPessoa($pessoa){
        $this->pessoas[] = $pessoa;
    }
    
    public function removePessoa($p){
        $this->pessoas->removeElement($p);
    }

    public function getAtualizado() {
        return $this->atualizado;
    }

    public function setAtualizado($atualizado) {
        $this->atualizado = $atualizado;
    }
    
    public function getImagem() {
        return $this->imagem;
    }

    public function setImagem($imagem) {
        $this->imagem = $imagem;
    }

    public function getEventoConfig() {
        return $this->eventoConfig;
    }

    public function setEventoConfig($eventoConfig) {
        $this->eventoConfig = $eventoConfig;
    }
    
    public function getHabilitaEnvioExtrato() {
        return $this->habilitaEnvioExtrato;
    }

    public function setHabilitaEnvioExtrato($habilitaEnvioExtrato) {
        $this->habilitaEnvioExtrato = $habilitaEnvioExtrato;
    }

    public function getEmailExtrato() {
        return $this->emailExtrato;
    }

    public function setEmailExtrato($emailExtrato) {
        $this->emailExtrato = $emailExtrato;
    }

    public function getIntervaloExtrato() {
        return $this->intervaloExtrato;
    }

    public function setIntervaloExtrato($intervaloExtrato) {
        $this->intervaloExtrato = $intervaloExtrato;
    }
    
    public function getDtCreate() {
        return $this->dtCreate;
    }

    public function setDtCreate($dtCreate) {
        $this->dtCreate = $dtCreate;
    }
    
    public function getEventoEmpresa(){
        return $this->info->getDescricao().' ('.$this->empresa->getRazaoSocial().')';
    }
    
    public function setAtendentes($atendentes) {
        $this->atendentes = $atendentes;
    }
    
    public function getAtendentes() {
        return $this->atendentes;
    }
    
    public function getVisualizacao() {
        return $this->visualizacao;
    }

    public function setVisualizacao($visualizacao) {
        $this->visualizacao = $visualizacao;
    }
    
    public function getRepasses() {
        return $this->repasses;
    }

    public function setRepasses($repasses) {
        $this->repasses = $repasses;
    }
    
    public function getBanner() {
        return $this->banner;
    }

    public function setBanner($banner) {
        $this->banner = $banner;
    }
       
    public function getMapa() {
        return $this->mapa;
    }

    public function setMapa($mapa) {
        $this->mapa = $mapa;
    }
    
    public function getTipoMapa() {
        return $this->tipoMapa;
    }

    public function setTipoMapa($tipoMapa) {
        $this->tipoMapa = $tipoMapa;
    }
    
    public static function getTipoMapaList(){
        return array(self::TP_MAPA_QUADRADO => self::TP_MAPA_QUADRADO,
                     self::TP_MAPA_RETANGULO => self::TP_MAPA_RETANGULO,
                     self::TP_MAPA_RETANGULO_GRANDE => self::TP_MAPA_RETANGULO_GRANDE);
    }
    
    public function getAmbientes() {
        return $this->ambientes;
    }

    public function setAmbientes($ambientes) {
        $this->ambientes = $ambientes;
    }


}